package com.fruit.common.mipush;

import java.util.ArrayList;
import java.util.List;

import com.xiaomi.xmpush.server.Constants;
import com.xiaomi.xmpush.server.Message;
import com.xiaomi.xmpush.server.Result;
import com.xiaomi.xmpush.server.Sender;

/**
 * 小米Push推送工具类
 * 
 * @author Administrator
 *
 */
public class MiPushUtils {
	private final static int PASS_THROUGH_MESSAGE = 0;// 1表示透传消息
	private final static int NOTIFICATION_MESSAGE = 0;// 0表示通知栏消息
	private final static int PASS_THROUGH = NOTIFICATION_MESSAGE;// 1表示透传消息，0表示通知栏消息

	private final static int DEFAULT_ALL = -1;
	private final static int DEFAULT_SOUND = 1; // 使用默认提示音提
	private final static int DEFAULT_VIBRATE = 2; // 使用默认震动提示
	private final static int DEFAULT_LIGHTS = 4; // 使用默认led灯光提示
	private final static int NOTIFY_TYPE = DEFAULT_ALL;

	private static String APP_SECRET = "i0wo4U9QfIyLBox/JVAEEw==";
	private static String ANDROID_PACKAGE_NAME = "com.example.admin.aggregatepush";
	private static int DEVELOPMENT_MODE = 1; // 1=正式环境/0=测试

	public final static int TYPE_ANDROID = 0;
	public final static int TYPE_IOS = 1;
	// 消息发送
	public static Sender sender = null;
	// 初始化
	static {
		sender = new Sender(APP_SECRET);
	}

	/**
	 * 调用小米推送
	 */
	public static void reStartPush(int deviceType) {
		// 如果为测试环境
		if (DEVELOPMENT_MODE == 0) {
			// 测试环境只提供对IOS支持，不支持Android
			Constants.useSandbox();
			if (deviceType == TYPE_ANDROID) {
				Constants.useOfficial();
			}
		} else {
			// 正式环境
			Constants.useOfficial();
		}
	}

	/**
	 * 构建android推送信息
	 *
	 * @param title
	 *            标题
	 * @param content
	 *            通知描述
	 * @param messagePayload
	 *            消息内容
	 * @param timeToSend
	 *            定时发送 毫秒单位
	 * @return
	 */
	private static Message buildMessage2Android(String title, String content, String messagePayload, long timeToSend)
			throws Exception {
		Message message = new Message.Builder().title(title).description(content).payload(messagePayload)
				.restrictedPackageName(ANDROID_PACKAGE_NAME)// 设置包名
				.passThrough(PASS_THROUGH) // 消息使用透传方式
				.notifyType(NOTIFY_TYPE) // 使用默认提示音提示
				// .enableFlowControl(true) // 控制消息是否需要进行平缓发送
				 .timeToSend(System.currentTimeMillis()+timeToSend) // 定时推送时间
				.build();
		return message;
	}

	/**
	 * 构建ios推送信息
	 *
	 * @param content
	 *            通知描述
	 * @param messagePayload
	 *            消息内容
	 * @param timeToSend
	 *            定时 毫秒单位
	 * @return
	 */
	private static Message buildMessage2IOS(String content, String messagePayload, long timeToSend) throws Exception {
		Message message = new Message.IOSBuilder().description(content).badge(1) // 数字角标
				.extra("payload", messagePayload).timeToSend(timeToSend).build();
		return message;
	}

	/**
	 * 构建发送信息
	 *
	 * @param title
	 *            标题
	 * @param content
	 *            通知描述
	 * @param messagePayload
	 *            消息内容
	 * @param deviceType
	 *            平台类型
	 * @param timeToSend
	 *            定时 单位毫秒
	 * @return Message
	 */
	private static Message buildMessage(String title, String content, String messagePayload, int deviceType,
			long timeToSend) throws Exception {
		Message message = null;
		if (deviceType == TYPE_ANDROID) {
			message = buildMessage2Android(title, content, messagePayload, timeToSend);
		} else if (deviceType == TYPE_IOS) {
			message = buildMessage2IOS(content, messagePayload, timeToSend);
		}
		return message;
	}

	/**
	 * 向所有设备发送推送信息
	 *
	 * @param title
	 *            标题
	 * @param content
	 *            通知描述
	 * @param messagePayload
	 *            消息内容
	 * @param deviceType
	 *            平台类型
	 * @param timeToSend
	 *            定时 单位毫秒
	 * @throws Exception
	 */
	public static Result sendBroadcastAll(String title, String content, String messagePayload, int deviceType,
			long timeToSend) throws Exception {
		reStartPush(DEVELOPMENT_MODE);// 准备小米推送

		Message message = buildMessage(title, content, messagePayload, deviceType, timeToSend);
		Result result = sender.broadcastAll(message, 0);// 推送消息给所有设备，不重试

		return result;
	}

	/**
	 * 根据regid发送一条消息
	 *
	 * @param title
	 *            标题
	 * @param content
	 *            通知描述
	 * @param messagePayload
	 *            消息内容
	 * @param regId
	 *            设备id
	 * @param deviceType
	 *            平台类型
	 * @throws Exception
	 */
	public static Result sendMessageToRegId(String title, String content, String messagePayload, String regId,
			int deviceType, long timeToSend) throws Exception {
		reStartPush(DEVELOPMENT_MODE);// 准备小米推送
		
		Message message = buildMessage(title, content, messagePayload, deviceType, timeToSend);
		Result result = sender.send(message, regId, 0); // 根据regID，发送消息到指定设备上，不重试。
		return result;
	}

	/**
	 * 根据alias发送一条消息
	 *
	 * @param title
	 *            标题
	 * @param content
	 *            通知描述
	 * @param messagePayload
	 *            消息体内容
	 * @param userMobile
	 *            用户标识（别名）
	 * @param deviceType
	 *            平台类型
	 * @throws Exception
	 */
	public static Result sendMessageToAlias(String title, String content, String messagePayload, String[] userMobile,
			int deviceType, long timeToSend) throws Exception {
		reStartPush(DEVELOPMENT_MODE);// 准备小米推送

		Message message = buildMessage(title, content, messagePayload, deviceType, timeToSend);
		List<String> aliasList = new ArrayList<String>();
		for (int i = 0; i < userMobile.length; i++) {
			 aliasList.add(userMobile[i]);  //alias非空白，不能包含逗号, 长度小于128
		}
	   
		Result result = sender.sendToAlias(message, aliasList, 0); // 根据alias，发送消息到指定设备上，不重试。
		return result;
	}
}
